package com.dkts.oil.util.gis;

import org.locationtech.jts.algorithm.Angle;
import org.locationtech.jts.geom.Coordinate;

/**
 * 解答夹角工具类
 */



public class DirectionUtils {

    /**
     * 计算两个坐标点之间的方位角（夹角）
     *
     * @param c1 第一个坐标点
     * @param c2 第二个坐标点
     * @return 方位角（单位：度）
     */
    public static double calculateBearing(Coordinate c1, Coordinate c2) {
        // 使用 JTS 计算两个点之间的方位角（以弧度表示）
        double angle = Angle.angle(c1, c2);
        // 将弧度转换为度
        double degrees = Math.toDegrees(angle);
        // 归一化为 0 到 360 度
        if (degrees < 0) {
            degrees += 360;
        }
        return degrees;
    }

    /**
     * 根据方位角获取对应的方向
     *
     * @param bearing 方位角（单位：度）
     * @return 方向字符串（如：北、东北、东等）
     */
    public static String getDirection(double bearing) {
        String[] directions = {"北", "东北", "东", "东南", "南", "西南", "西", "西北"};
        // 将方位角划分为8个方向
        int index = (int) Math.round(bearing / 45) % 8;
        return directions[index];
    }

    /**
     * 计算两个经纬度点之间的方位角，并返回方向
     *
     * @param lat1 第一个点的纬度
     * @param lon1 第一个点的经度
     * @param lat2 第二个点的纬度
     * @param lon2 第二个点的经度
     * @return 方向字符串（如：北、东北、东等）
     */
    public static String calculateDirection(double lat1, double lon1, double lat2, double lon2) {
        Coordinate c1 = new Coordinate(lon1, lat1);
        Coordinate c2 = new Coordinate(lon2, lat2);
        double bearing = calculateBearing(c1, c2);
        return getDirection(bearing);
    }

    public static void main(String[] args) {
        // 测试
        double lat1 = 30.0;
        double lon1 = 120.0;
        double lat2 = 25.0;
        double lon2 = 125.0;

        String direction = calculateDirection(lat1, lon1, lat2, lon2);
        System.out.println("方向: " + direction);
    }
}

